package com.bb.blog.code.threading;

import sun.misc.Unsafe;

import java.lang.reflect.Field;

/**
 * java 内存模型
 *
 */
public interface JMM {
    default  void lock(){
        System.out.println("执行了lock");
    }
    default  void unlock(){
        System.out.println("执行了unlock");
    }
    default  void read(){
        System.out.println("执行了read");
    }
    default void load(){
        System.out.println("执行了load");
    }
    default  void use(){
        System.out.println("执行了use");
    }
    default void assign(){
        System.out.println("执行了assign");
    }
    default void store(){
        System.out.println("执行了store");
    }
    default  void write(){
        System.out.println("执行了write");
    }




}

/**
 * volatile 是Java虚拟机提供的轻量级的同步机制
 *  * 1 可见性： 保证被volatile修饰的共享变量对所有县城总是可见的，也就是党一个县城修改了一个被volatile 修饰的共享变量的值，
 *  * 新值总是可以被其他县城立即得知。
 *  * 2 有序性 禁止指令重排来优化
 *  *
 */
interface Volatile{
    /**
     * 底层是通过内存屏障来避免指令重排的
     *
     * store store  保证1操作数据被刷到主存中，且1操作和2操作不能重排
     *     volatile 写
     * store load  保证 store操作的可见性，并先于 load的操作
     *
     * volatile 读
     * load load
     * load store
     *
     * 内存屏障规则
     * 所有volatile写之前
     * 所有volatile读之后
     * volatile写之后 volatile读之前

     */
    void MemoryBarrier();

    /**
     * 怎么手动加内存屏障
     */
    default  void addMemoryBarrier(){
        try{
            Field field = Unsafe.class.getDeclaredField("theUnsafe");
            field.setAccessible(true);
            Unsafe theUnsafe = (Unsafe) field.get(null);
            theUnsafe.storeFence();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

/**
 * Java代码从源码到执行过程
 * 1. 源代码
 * 2. 编译器优化重排序
 * 3. 指令级并行重排序
 * 4. 内存系统重排序
 * 5. 最终执行指令序列
 */

interface RunCode{

}